var a:string = 'hello word'
console.log(a);

// 类型注解、类型注释、类型签名/类型约束
// 语法  变量：类型
// 在ts文件中可以直接编写JS代码，虽然可能类型检测不通过，但是仍然可以成功编译类型


var a1:string = '你好'
a1='不好'
var a2:number = 20
a2=10
var a3:boolean = true
var a4:undefined = undefined
var a5:bigint = 123n
var a6:null = null
var a7:symbol = Symbol('hello')
a7 = Symbol('word')

// 数组array 
var list1:number[] = [1,2,3,4]
var list2:Array<string> = ['js','css','html']

var b:any = '你好'
b = 20
b = []
b = {}
b = true
b = null
b = undefined

// 类型推断,ts编辑器会根据变量的初始值的类型赋值给该变量
var c = 'hello world'
// c = 

// 函数
function add(a:number,b:number):number{
    return a+b
}
add(1,2)

// promise类型
// async function fetchData(url:data):Promisr<any> {
//     return await axios.get(url,data)
// }

// 没有返回值的函数需要给返回值类型为void
function fn(msg:string):void {
    console.log('你好');
}


// 可选属性 ？


// 接口 interface 接口本质上就是描述了对象的形状和方法
interface IUser {
    name: string,
    age: number,
    sex?: string//？代表可选
}

// 对象类型
var user:IUser = {
    name:'张三',
    age: 20,
    // sex: '男'
}


// 接口案例
interface IUser2 {
    name:string,
    age:number,
    sex:string,
    hobby:Array<string>
}

var user2:IUser2={
    name:'张三',
    age:20,
    sex:'男',
    hobby:['吃','喝','睡']
}

// 接口案例2
interface IAddress {
    id:string,
    name:string
}
interface IUser3 {
    name:string,
    age:number,
    sex:string,
    hobby:Array<string>,
    address:Array<IAddress>
}

var user3:IUser3 = {
    name:'张三',
    age:20,
    sex:'男',
    hobby:['吃','喝','睡'],
    address:[
        {
            id:'1001',
            name:'湖北省'
        },
        {
            id:'1101',
            name:'武汉市'
        },
    ]
}

// 类型别名：：给一个类型取一个名字
type TAddress = {
    id:string,
    name:string
}
type TUser3 = {
    name:string,
    age:number,
    sex:string,
    hobby:Array<string>,
    address:Array<IAddress>
}
var user3 = {
    name:'张三',
    age:20,
    sex:'男',
    hobby:['吃','喝','睡'],
    address:[
        {
            id:'1001',
            name:'湖北省'
        },
        {
            id:'1101',
            name:'武汉市'
        },
    ]
}
// 类型别名和接口的区别
          
// 类型别名不能合并，接口可以


// 断言:类型断言、非空断言
// 类型断言：断定某个数据一定是某个类型（有值）    as
// 非空断言：断定某个数据一定是有值的    ！
// 使用场景：对于部分ts编译器无法正确的推断数据类型的时候或者推断类型错误的时候使用
const app=document.getElementById('app') as HTMLDivElement//断定获取的DOM对象一定是HTMLElement类型
console.log(app.innerHTML);


const app1 = document.getElementById('app')! .innerHTML//非空断言：断定某个数据一定是有值的
console.log(app1);

enum Directon {
    EAST,
    SOUTH,
    WEST,
    NORTH,
}
console.log(Directon);

var east = Directon[0]
console.log(east);

enum Sex {
    MAN = '男',
    WOMAN = '女'
}

console.log(Sex);
console.log(Sex['MAN']);





